package android.remotematrixclient.objclient;

import java.io.Serializable;


/**
 * La clase <code>CommandWrap</code> es una clase envoltorio para los comandos 
 * y argumentos enviados al servicio de ejecución remota. Esta clase posee un 
 * número identificador que se incrementa con cada nueva instancia de la clase 
 * de forma automática para garantizar que cada identificación es única en cada
 * conexión con el servidor.
 * 
 * @author Rafael Asprilla
 *
 */

public class CommandWrap implements Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 2710121279941355322L;
	
	/**
	 * Cadena con el comando a ser realizado. Para el servidor actual las 
	 * cadenas de comando son: 
	 * - ACK
	 * - PUT, 
	 * - GET, 
	 * - EXE, 
	 * - PRC,
	 * - FIN
	 */
	public final String cmd;
	
	/**
	 * Datos enviados a través del los flujos de objetos.
	 */
	public final Object data;
	
	/**
	 * En el caso de que <code>cmd == "ACK"</code>, define si la operación 
	 * anterior fue exitosa. La propiedad <code>id</code> permite al extremo 
	 * que envía referenciar las respuestas a los comandos.
	 */
	public final boolean success;
	
	/**
	 * Conteo de identificadores, permite crear contadores únicos para cada 
	 * transacción.
	 */
	private static int idcnt = 0;
	
	/**
	 * Número de identificación de la instancia actual.
	 */
	public final int id;
	
	/**
	 * Si una respuesta <code>cmd == "ACK"</code> entonces <code>ack</code> 
	 * define si la transacción fue exitosa o no.
	 */
	public final boolean ack;
	
	/**
	 * Constructor de la clase <code>CommandWrap</code>.
	 * 
	 * @param cmd
	 * Comando a ser ejecutado en el otro extremo, puede ser un acuse de 
	 * recibo.
	 * también.
	 * @param data
	 * Datos a ser enviados.
	 */
	public CommandWrap(String cmd, Object data){
		this(cmd, data, false, false, idcnt++);
	}
	
	/**
	 * Constructor de la clase <code>CommandWrap</code>.
	 * 
	 * @param cmd
	 * Comando a ser ejecutado en el otro extremo, puede ser un acuse de 
	 * recibo.
	 * también.
	 * @param data
	 * Datos a ser enviados.
	 * @param id
	 * Identificador de la transacción.
	 */
	public CommandWrap(String cmd, Object data, int id){
		this(cmd, data, false, false, id);
	}
	
	/**
	 * Constructor de la clase <code>CommandWrap</code>.
	 * 
	 * @param cmd
	 * Comando a ser ejecutado en el otro extremo, puede ser un acuse de 
	 * recibo.
	 * también.
	 * @param data
	 * Datos a ser enviados.
	 * @param ack
	 * Define si el mensaje es un acuse de recibo.
	 * @param success
	 * Define el estatus de la transacción. 
	 * @param id
	 * Identificador de la transacción.
	 */
	public CommandWrap(String cmd, Object data, boolean ack, boolean success, int id){
		this.cmd = cmd;
		this.data = data;
		this.ack = ack;
		this.success = success;
		this.id = id;
	}
	

}
